/********************************************
* Copyrigt (C) rumi
* Module: drv_dh11.c
*********************************************/
#include "drv_dh11.h"

static const char *TAG = "drv_dh11.c";
/**************************Init Area*********************************/
static void DelayUs(uint32_t us)
{
    esp_rom_delay_us(us);
}
/*******************************************************************/

static bool waitPinLevel(gpio_num_t gpioNum, uint32_t timeoutUs, int expectedLevel) {
    int64_t startTime = esp_timer_get_time();
    while (gpio_get_level(gpioNum) != expectedLevel) {
        if (esp_timer_get_time() - startTime > timeoutUs) {
            return false;
        }
    }
    return true;
}

Dht11ErrorCode readDht11DataSimple(gpio_num_t gpioNum, float* temperature, float* humidity) {
    uint8_t data[5] = {0};
    
    gpio_set_direction(gpioNum, GPIO_MODE_OUTPUT);
    gpio_set_level(gpioNum, 0);
    DelayUs(18000); 
    gpio_set_level(gpioNum, 1);
    DelayUs(30);     
    gpio_set_direction(gpioNum, GPIO_MODE_INPUT);

    while(gpio_get_level(gpioNum) == 1); 
    while(gpio_get_level(gpioNum) == 0); 
    while(gpio_get_level(gpioNum) == 1);

    for(int i=0; i<40; i++) {
        while(gpio_get_level(gpioNum) == 0);
        if(gpio_get_level(gpioNum)) {
            data[i/8] |= (1 << (7 - (i%8)));
            while(gpio_get_level(gpioNum) == 1); 
        }
    }

    if(data[4] != (data[0]+data[1]+data[2]+data[3])) {
        ESP_LOGE(TAG, "Checksum error");
        return DHT11_ERROR_CHECKSUM;
    }

    *humidity = data[0];
    *temperature = data[2];
    return DHT11_OK;
    
}
// Dht11ErrorCode readDht11Data(gpio_num_t gpioNum, float* temperature, float* humidity) {
//     uint8_t data[5] = {0};
    
//     gpio_set_direction(gpioNum, GPIO_MODE_OUTPUT);
//     gpio_set_level(gpioNum, 0);
//     esp_rom_delay_us(18000); 
//     gpio_set_level(gpioNum, 1);
//     esp_rom_delay_us(30);
//     gpio_set_direction(gpioNum, GPIO_MODE_INPUT);
//     gpio_set_pull_mode(gpioNum, GPIO_PULLUP_ONLY);

//     if (!waitPinLevel(gpioNum, 100, 0)) {
//         ESP_LOGE(TAG, "Response timeout (low phase)");
//         return DHT11_ERROR_TIMEOUT;
//     }
//     if (!waitPinLevel(gpioNum, 100, 1)) {
//         ESP_LOGE(TAG, "Response timeout (high phase)");
//         return DHT11_ERROR_TIMEOUT;
//     }

//     for (int i = 0; i < 40; i++) {

//         if (!waitPinLevel(gpioNum, 100, 0)) {
//             ESP_LOGE(TAG, "Data bit start timeout");
//             return DHT11_ERROR_TIMEOUT;
//         }
        
//         int64_t start = esp_timer_get_time();
//         if (!waitPinLevel(gpioNum, 100, 1)) {
//             ESP_LOGE(TAG, "Data bit high timeout");
//             return DHT11_ERROR_TIMEOUT;
//         }
        
//         uint32_t duration = esp_timer_get_time() - start;
//         ESP_LOGE(TAG, "Data %ld",duration);
//         if (duration > 50) {
//             data[i/8] |= (1 << (7 - (i % 8)));
//         }
//     }

//     // if (data[4] != (data[0] + data[1] + data[2] + data[3])) {
//     //     ESP_LOGE(TAG, "Checksum error");
//     //     return DHT11_ERROR_CHECKSUM;
//     // }

//     *humidity = data[0];
//     *temperature = data[2];

//     ESP_LOGI(TAG, "Read successful: %.1fC, %.1f%%", *temperature, *humidity);
//     return DHT11_OK;
// }


/********************************************
 * End of file
*********************************************/
